s = [1, 2, 3]
t = [4, 5, 6]

# 列表的加法
print(s + t) # [1, 2, 3, 4, 5, 6]

# 列表的乘法
print(s * 3) # [1, 2, 3, 1, 2, 3, 1, 2, 3]

# 嵌套列表
# matrix：矩阵
matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]
print(matrix)


# 访问嵌套列表
for i in matrix:
    for each in i:
        print(each, end=" ") # 末尾添加空格
    print() # 换行

# 通过下标访问
print(matrix[0]) # 访问指定行 [1, 2, 3]
print(matrix[0][0]) # 访问指定元素 1

A = [0] * 3
print(A) # [0, 0, 0]
for i in range(3) :
    A[i] = [0] * 3
print(A) # [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
print(A[0] is A[1]) # False
print(A[1] is A[2]) # False
# 修改 A 中的一个元素
A[1][1] = 1
print(A) # [[0, 0, 0], [0, 1, 0], [0, 0, 0]]


# 引入问题

# 有些人想到了这样的快速创建矩阵的方式，粗看感觉没啥问题
B = [[0] * 3] * 3
print(B) # [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
# 此时如果修改 B 中的一个元素
B[1][1] = 1
print(B) # [[0, 1, 0], [0, 1, 0], [0, 1, 0]] 其实三个元素都被修改了，因为他们都指向同一块内存

# 明细 A 与 B 修改相同位置的元素之后，结果完全不一样，为什么？

# 要弄清楚上面为什么有问题，先看下面的知识
x = "FishC"
y = "FishC"
print(x is y) # True，因为字符串是不可变的，相同的字符串，内存相同

x = [1, 2, 3]
y = [1, 2, 3]
print(x is y) # False，列表是可变的，开辟了2个内存

# 从上可知， xxx is yyyy 这个运算符的作用

A = [0] * 3
print(A)
for i in range(3) :
    A[i] = [0] * 3

print(A[0] is A[1]) # False
print(A[1] is A[2]) # False

B = [[0] * 3] * 3 # 并不是拷贝，只是重复引用，3内存相同的老板
print(B[0] is B[1]) # True
print(B[1] is B[2]) # True
print(B[0] is B[2]) # True

# 问题总结：A 在内存中三行元素是不同的，但是 B 在内存中三行元素是相同的

